﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Xna.Framework;

namespace SpiritAlight.GeneralClac
{
    static class Calc
    {
       
        /// <summary>
        /// 2点の角度を計算する
        /// </summary>
        /// <param name="point1">基準点</param>
        /// <param name="point2">角度を計算する点</param>
        /// <returns>2点の角度</returns>
        public static double Angle(Vector2 point1, Vector2 point2)
        {
            return Math.Atan2((double)point2.X - (double)(point1.X),
                              (double)point2.Y - (double)(point1.Y));
        }

        /// <summary>
        /// 角度からベクトルを生成する。
        /// </sumSmary>
        /// <param name="angle">角度</param>
        /// <returns>ベクトル</returns>
        public static Vector2 VectorFromAngle(double angle)
        {
            Vector2 vector = new Vector2();

            vector.X = (float)Math.Sin(angle);
            vector.Y = (float)Math.Cos(angle);

            return vector;
        }

        /// <summary>
        /// 2つの座標がある一定の誤差の範囲内かどうか調べる。
        /// </summary>
        /// <param name="value1">調べる点1</param>
        /// <param name="value2">調べる点2</param>
        /// <param name="tolerance">許される誤差。</param>
        /// <returns>範囲内=true</returns>
        public static bool IsApproximation(Vector2 value1, Vector2 value2, Vector2 tolerance)
        {
            if ((value1.X - value2.X <= tolerance.X && value1.X - value2.X >= -tolerance.X) &&
                (value1.Y - value2.Y <= tolerance.Y && value1.Y - value2.Y >= -tolerance.Y))
                return true;

            return false;
        }

        /// <summary>
        /// 長方形のと1点が重なっているか調べる。
        /// </summary>
        /// <param name="position">長方形の位置</param>
        /// <param name="size">長方形のサイズ</param>
        /// <param name="inPoint">点の位置</param>
        /// <returns>重なっている=true</returns>
        public static bool IntersectPoint(Vector2 position ,Vector2 size, Vector2 inPoint)
        {
            if (position.X > inPoint.X || position.X + size.X < inPoint.X ||
                position.Y > inPoint.Y || position.Y + size.Y < inPoint.Y)
                return false;

            return true;
        }
    }
}
